
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>k8s 下线node正确处理姿势 驱逐 node</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <blockquote> 
 <p>有时候可能会在生产环境中的k8s的node节点对docker文件daemon.json进行更改并且重启或者node节点出现其他故障或者需要进行其他方面维护，但是该node节点上有很多pod还在跑着，这时候就需要用到drain和uncordon两个命令：</p> 
</blockquote> 
<ul><li>drain：释放排空node上所有pod，并且不接收新的pod进程(自动设置节点状态为 cordon )</li><li>uncordon ：恢复node，恢复接收新的pod进程<br> kubectl drain在对节点执行维护之前,可以使用从节点安全地逐出所有pod.安全驱逐允许pod的容器优雅地终止并且将遵守您指定的PodDisruptionBudgets</li></ul> 
<blockquote> 
 <p>注意: 默认情况下,kubectl drain将忽略节点上无法杀死的某些系统窗格; 有关更多详细信息,请参阅kubectl drain文档。</p> 
</blockquote> 
<p>当kubectl drain成功返回时,表示所有pod(除了前一段中所述排除的那些)已被安全驱逐(尊重所需的正常终止期,并且不违反任何应用程序级别的中断SLO).然后通过关闭其物理机器来关闭节点是安全的,或者如果在云平台上运行,则删除其虚拟机。</p> 
<h3><a id="_10"></a>操作流程</h3> 
<h4><a id="1_12"></a>1.获取节点列表</h4> 
<pre><code>[root@k8s-master1 ~]# kubectl get node -o wide
NAME        STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
k8s-node1   Ready    &lt;none&gt;   35d   v1.17.5   10.23.215.243   &lt;none&gt;        CentOS Linux 7 (Core)   3.10.0-1062.4.1.el7.x86_64   docker://18.9.9
k8s-node2   Ready    &lt;none&gt;   35d   v1.17.5   10.23.215.244   &lt;none&gt;        CentOS Linux 7 (Core)   3.10.0-1062.4.1.el7.x86_64   docker://18.9.9
k8s-node3   Ready    &lt;none&gt;   35d   v1.17.5   10.23.215.245   &lt;none&gt;        CentOS Linux 7 (Core)   3.10.0-1062.4.1.el7.x86_64   docker://18.9.9
</code></pre> 
<h4><a id="2pod_24"></a>2.驱逐该节点上所有的pod</h4> 
<p>如遇到daemonsets报错可以增加参数 --ignore-daemonsets</p> 
<pre><code>[root@k8s-master1 ~]# kubectl drain k8s-node3 --force --ignore-daemonsets --delete-local-data
node/k8s-node3 already cordoned
node/k8s-node3 drained
</code></pre> 
<h5><a id="drain_34"></a>drain参数解释：</h5> 
<ul><li> <p>–force：<br> 不加force参数只会删除该NODE上由ReplicationController, ReplicaSet, DaemonSet,StatefulSet or Job创建的Pod。加了后还会删除’裸奔的pod’(没有绑定到任何replication controller)。即当一些pod不是经 ReplicationController, ReplicaSet, Job, DaemonSet 或者 StatefulSet 管理的时候就需要用–force来强制执行 (例如:kube-proxy)。</p> </li><li> <p>–ignore-daemonsets：<br> 忽略DaemonSet管理下的Pod。如果不忽略，deamonset控制器控制的pod被删除后可能马上又在此节点上启动起来,会成为死循环。</p> </li><li> <p>–delete-local-data：<br> 即使pod使用了emptyDir也删除。如果有mount local volumn的pod，会强制杀掉该pod并把数据清除掉。另外如果跟本身的配置讯息有冲突时，drain就不会执行。</p> </li></ul> 
<p>例如你在一个运行了三个replica的statefulSet中设定了PodDisruptionBudget，而minAvaliability又设成了2，当正在运行的pod数量等于或者少于2的时候，drain就会停止执行。</p> 
<h4><a id="3_49"></a>3.安全的操作节点</h4> 
<p>这时候把需要做的事情做一下。比如上面说的更改docker文件<code>daemon.json</code>或者说node节点故障需要进行的处理操作然后可以恢复可调度</p> 
<p>查看节点上是否还有pod运行</p> 
<pre><code>[root@k8s-master1 ~]# kubectl get pod -o wide
NAME                              READY   STATUS      RESTARTS   AGE     IP               NODE        NOMINATED NODE   READINESS GATES
busybox                           0/1     Completed   0          14d     10.244.36.66     k8s-node1   &lt;none&gt;           &lt;none&gt;
nginx-deployment-8d9f7c4f-dsdvw   1/1     Running     1          8d      10.244.36.76     k8s-node1   &lt;none&gt;           &lt;none&gt;
nginx-deployment-8d9f7c4f-kqq5p   1/1     Running     2          8d      10.244.169.141   k8s-node2   &lt;none&gt;           &lt;none&gt;
nginx-deployment-8d9f7c4f-pnfbz   1/1     Running     0          2m25s   10.244.36.79     k8s-node1   &lt;none&gt;           &lt;none&gt;
</code></pre> 
<p>删除节点</p> 
<pre><code>[root@k8s-master1 ~]# kubectl delete node k8s-node3
node "k8s-node3" deleted
</code></pre> 
<p>查看节点是否被删除</p> 
<pre><code>[root@k8s-master1 ~]# kubectl get node -o wide
NAME        STATUS   ROLES    AGE   VERSION   INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
k8s-node1   Ready    &lt;none&gt;   35d   v1.17.5   10.23.215.243   &lt;none&gt;        CentOS Linux 7 (Core)   3.10.0-1062.4.1.el7.x86_64   docker://18.9.9
k8s-node2   Ready    &lt;none&gt;   35d   v1.17.5   10.23.215.244   &lt;none&gt;        CentOS Linux 7 (Core)   3.10.0-1062.4.1.el7.x86_64   docker://18.9.9
</code></pre> 
<h4><a id="4nodepod_83"></a>4.然后恢复node，恢复接收新的pod进程</h4> 
<p>kubectl uncordon [node-name]</p>
                </div>
            </body>
            </html>
            